package com.itheima.edu.day21Thread.soleTikets;

public class Ticket implements Runnable {
    //定义一个参数，代表线程需要操作的参数
    //static修饰了成员变量之后，代表将它变成了共享的数据，避免了多个线程出现重复的情况
    private static int ticket = 100;
    //对象锁的唯一，避免了出现多个线程同时操作同一个数据，从而产生负数的情况。
    private static Object obj = new Object();

    @Override
    public void run() {
        while (true){
            //同步代码块，synchronized关键字进行包裹，表示只要有一个线程在里面执行操作，那么别的线程就无法进入，只能等待正在执行的线程操作结束
            //obj是任意对象
            //obj处，作为一个锁对象，它应该是唯一的，才能避免由于出现多个对象锁而导致的重复和出现负数的情况。
            synchronized (obj){
                if (ticket <= 0) {
                    //代表票已经卖完了
                    break;
                } else {

                    try {
                        //由于现实生活中，打印票也需要一定的时间，所以需要给每个线程加上一个sleep
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //问题：为什么加了sleep会导致重复票的出现
                    //一开始感觉每个线程时独立运行的，结果加了sleep了之后，为什么其他线程就可以修改之前的线程的数据了？

                    //初步理解：加了sleep之后，导致了多个线程同时操作了同一个数据


                    //当卖了第一张票的时候，如果不先--，打印出来的就是 ==> 窗口x正在卖票，还剩下100张
                    ticket--;
                    System.out.println(Thread.currentThread().getName() + "在卖票，还剩下" + ticket + "张票");
                }
            }
        }
    }
}
